继承

1. 概述

继承是面向对象编程(OOP)中的一个重要概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。通过继承,子类可以重用父类的代码,并且可以在不修改父类的情况下扩展或修改其功能。

1.1 继承的优点

  • 代码重用:子类可以继承父类的属性和方法,减少代码重复。
  • 扩展性:子类可以在父类的基础上添加新的属性和方法,或者重写父类的方法。
  • 维护性:通过继承,代码结构更加清晰,便于维护和扩展。

2. 基本语法

在 Java 中,使用 extends 关键字来实现继承。语法如下:

class ParentClass {
    // 父类的属性和方法
}

class ChildClass extends ParentClass {
    // 子类的属性和方法
}

2.1 示例代码

class Animal {
    String name;

    public Animal(String name) {
        this.name = name;
    }

    public void eat() {
        System.out.println(name + " is eating.");
    }
}

class Dog extends Animal {
    public Dog(String name) {
        super(name); // 调用父类的构造方法
    }

    public void bark() {
        System.out.println(name + " is barking.");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog("Buddy");
        myDog.eat();  // 继承自父类的方法
        myDog.bark(); // 子类特有的方法
    }
}

2.2 解释

  • Animal 是父类,包含一个 name 属性和一个 eat 方法。
  • Dog 是子类,继承了 Animal 类,并添加了一个 bark 方法。
  • 在 Dog 类的构造方法中,使用 super(name) 调用父类的构造方法来初始化 name 属性。

3. 方法重写

子类可以重写(Override)父类的方法,以实现不同的行为。重写方法时,子类的方法签名必须与父类的方法签名相同。

3.1 示例代码

class Animal {
    String name;

    public Animal(String name) {
        this.name = name;
    }

    public void eat() {
        System.out.println(name + " is eating.");
    }
}

class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }

    @Override
    public void eat() {
        System.out.println(name + " is eating dog food.");
    }

    public void bark() {
        System.out.println(name + " is barking.");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog("Buddy");
        myDog.eat();  // 调用子类重写的方法
        myDog.bark();
    }
}

3.2 解释

  • Dog 类重写了 Animal 类的 eat 方法,输出不同的内容。
  • 在 main 方法中,调用 myDog.eat() 时,执行的是 Dog 类中重写的 eat 方法。

4. super 关键字

super 关键字用于在子类中访问父类的属性和方法。

4.1 示例代码

class Animal {
    String name;

    public Animal(String name) {
        this.name = name;
    }

    public void eat() {
        System.out.println(name + " is eating.");
    }
}

class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }

    @Override
    public void eat() {
        super.eat(); // 调用父类的 eat 方法
        System.out.println(name + " is eating dog food.");
    }

    public void bark() {
        System.out.println(name + " is barking.");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog("Buddy");
        myDog.eat();  // 调用子类重写的方法
        myDog.bark();
    }
}

4.2 解释

  • 在 Dog 类的 eat 方法中,使用 super.eat() 调用父类的 eat 方法。
  • 这样可以在子类的方法中先执行父类的逻辑,再执行子类特有的逻辑。

5. 实践练习

5.1 练习题目

创建一个 Vehicle 类,包含 brand 和 speed 属性,以及 start 和 stop 方法。然后创建一个 Car 类,继承 Vehicle 类,并添加 drive 方法。最后,创建一个 Main 类,实例化 Car 对象并调用其方法。

5.2 参考答案

class Vehicle {
    String brand;
    int speed;

    public Vehicle(String brand, int speed) {
        this.brand = brand;
        this.speed = speed;
    }

    public void start() {
        System.out.println(brand + " is starting.");
    }

    public void stop() {
        System.out.println(brand + " is stopping.");
    }
}

class Car extends Vehicle {
    public Car(String brand, int speed) {
        super(brand, speed);
    }

    public void drive() {
        System.out.println(brand + " is driving at " + speed + " km/h.");
    }
}

public class Main {
    public static void main(String[] args) {
        Car myCar = new Car("Toyota", 120);
        myCar.start();
        myCar.drive();
        myCar.stop();
    }
}

6. 总结

继承是 Java 中实现代码重用和扩展的重要机制。通过继承,子类可以继承父类的属性和方法,并且可以在不修改父类的情况下扩展或修改其功能。理解继承的基本语法、方法重写和 super 关键字的使用,是掌握面向对象编程的关键。

通过本教程的学习,你应该能够理解继承的概念,并能够在实际编程中应用继承来构建更加灵活和可维护的代码。